package com.qf.agro.web.interceptors;

import com.alibaba.fastjson.JSON;
import com.qf.agro.common.sys.Constant;
import com.qf.agro.common.sys.ResultInfo;
import com.qf.agro.common.sys.SysUserHolder;
import com.qf.agro.pojo.sys.SysUser;

import com.qf.agro.utils.JwtUtil;
import io.jsonwebtoken.Claims;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @company：千锋教育
 * @author：zhy
 * @date：2023/6/30
 *
 * 检查登录的拦截器
 */
@Component
public class CheckLoginInterceptor implements HandlerInterceptor {

    @Autowired
    private JwtUtil jwtUtil;

    /**
     * 检查登录
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //1.取出消息头中的名称为Authorization的消息头
        String authorization = request.getHeader("Authorization");
        //2.判断消息头是否为null
        if(StringUtils.isEmpty(authorization)) {
            //3.如果为null，表示他要么没登录，要么登录过期了，此时应该返回未登录的错误信息
            //创建返回值
            ResultInfo resultInfo = ResultInfo.nologin(Constant.NOT_LOGIN);
            //把返回值转成JSON字符串
            String json = JSON.toJSONString(resultInfo);
            //用流输出json到ajax引擎
            response.getWriter().write(json);
            //不放行
            return false;
        }
        try {
            //4.利用工具类，解析消息头
            Claims claims = jwtUtil.parseJWT(authorization);
            //5.取出用户的信息，校验通过，可以放行
            if(claims != null) {
                String userId = claims.getId();
                String subject = claims.getSubject();//sysUser转成的json对象
                //把subject转成SysUser对象
                SysUser sysUser = JSON.parseObject(subject, SysUser.class);
                System.err.println("token解析出来的用户是："+sysUser);
                if(sysUser != null){
                    //把当前认证成功的用户和线程绑定
                    SysUserHolder.set(sysUser);
                    //放行
                    return true;
                }
            }
        }catch (Exception e) {
            //6.如果出异常了，则表示token被篡改过了，不能放行，返回认证信息无效，重新登录（重新认证）
            //创建返回值
            ResultInfo resultInfo = ResultInfo.nologin(Constant.NOT_LOGIN);
            //把返回值转成JSON字符串
            String json = JSON.toJSONString(resultInfo);
            //用流输出json到ajax引擎
            response.getWriter().write(json);
            //不放行
            return false;
        }
        //7.不能放行
        return false;
    }


    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        SysUserHolder.remove();
    }
}
